function _runTask(task, callback) {
    // 当前帧是否有剩余时间，有就执行任务，否则就进入下一帧
    requestIdleCallback((idle) => {
        // 判断当前帧是否有剩余时间
        if(idle.timeRemaining() > 0) {
            task()
            callback()
        } else {
            _runTask(task, callback)
        }
    })
}

function _runTask(task, callback) {
    // 当前帧是否有剩余时间，有就执行任务，否则就进入下一帧
    const start = Date.now()
    requestAnimationFrame((idle) => {
        // 判断当前帧是否有剩余时间
        if(Date.now() - start > 16.6) {
            task()
            callback()
        } else {
            _runTask(task, callback)
        }
    })
}

/**
 * 运行一个耗时任务。点击事件触发后，runTask会被调用1000次
 * 传入的task也是个耗时任务
 * 如果要异步执行，返回一个promise
 * 要尽快完成任务，同时不要让页面卡顿
 * 尽量兼容更多的浏览器
 * @param {Function} task 
 */
function runTask(task) {
    return new Promise((resolve, reject) => {
        _runTask(task, resolve)
    })
}